package juego;

import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.SAXBuilder;
import org.jdom.output.*;
import excepciones.ErrorAlCargarArchivo;

/*
 * Clase encargada de crear, guardar, y cargar los puntajes de los jugadores.
 */
public class Records {

	public class Record {
		private String nombre = "NaN";
		private String puntos = "NaN";
		private String fecha = "NaN";

		private Record() {
			String dia = Integer.toString(Calendar.getInstance().get(
					Calendar.DATE));
			String mes = Integer.toString(Calendar.getInstance().get(
					Calendar.MONTH));
			String anio = Integer.toString(Calendar.getInstance().get(
					Calendar.YEAR));
			this.fecha = dia + "/" + mes + "/" + anio;
		}

		private Record(String nombreJugador, int puntaje) {
			this();
			this.nombre = nombreJugador;
			this.puntos = String.valueOf(puntaje);
		}

		@Override
		public String toString() {
			return this.nombre + " - " + this.puntos + " - " + this.fecha;
		}

		/* Persistencia */
		private Record(Element nodo) {
			this.nombre = nodo.getAttributeValue("nombre");
			this.puntos = nodo.getAttributeValue("puntos");
			this.fecha = nodo.getAttributeValue("fecha");
		}

		private Element obtenerNodo() {
			Element nodo = new Element("record");
			nodo.setAttribute(new Attribute("nombre", this.nombre));
			nodo.setAttribute(new Attribute("puntos", this.puntos));
			nodo.setAttribute(new Attribute("fecha", this.fecha));
			return nodo;
		}
	}

	private ArrayList<Record> records = new ArrayList<Record>();

	public ArrayList<Record> getRecords() {
		if (this.records.isEmpty()) {
			this.cargarRecords();
		}
		return this.records;
	}

	public void nuevoRecord(String nombreJugador, int puntaje) {
		this.records.add(new Record(nombreJugador, puntaje));
		try {
			guardarRecords();
		} catch (ErrorAlCargarArchivo e) {
			e.printStackTrace();
		}
	}

	public void guardarRecords() throws ErrorAlCargarArchivo {
		/* Creamos el elemento root */
		Element root = new Element("records");

		/* Pasamos por todos los records existentes */
		for (Record record : this.records) {
			root.addContent(record.obtenerNodo());
		}

		/* Creamos el documento almacenando todo el arbol y el doctype */
		Document doc = new Document(root);

		/* Lo almacenamos en un fichero dado por argumento */
		try {
			XMLOutputter salidaXml = new XMLOutputter(Format.getPrettyFormat());
			FileOutputStream archivo = new FileOutputStream("./records.xml");
			salidaXml.output(doc, archivo);
			archivo.flush();
			archivo.close();
		} catch (Exception ex) {
			throw new ErrorAlCargarArchivo("No se pudieron guardar los records");
		}
	}

	public void cargarRecords() {
		String archivoACargar = "./records.xml";
		SAXBuilder builder = new SAXBuilder();

		Document doc = null;
		Element root = null;

		try {
			doc = builder.build(new FileInputStream(archivoACargar));
		} catch (JDOMException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		root = doc.getRootElement();
		@SuppressWarnings("unchecked")
		List<Element> hijos = root.getChildren("record");

		for (Element hijo : hijos) {
			this.records.add(new Record(hijo));
		}
	}

}
